package com.haiheng.commonlibrary

import android.app.Activity
import android.app.Application
import android.content.Context
import android.os.Build
import coil.ImageLoader
import coil.ImageLoaderFactory
import coil.decode.GifDecoder
import coil.decode.ImageDecoderDecoder
import coil.decode.SvgDecoder
import com.haiheng.adscreen.AppForegroundListener
import com.haiheng.common.api.MyBaseUrlAdapter
import com.haiheng.common.constant.AppConstant
import com.haiheng.library.log.LogUtils
import com.haiheng.library_base.http.OkHelper
import com.haiheng.library_base.http.RetrofitParams
import com.haiheng.library_base.http.setBaseUrl
import com.haiheng.library_base.http.setHttpClient
import com.haiheng.library_base.toast.SizeUtils
import com.haiheng.library_base.utils.ApplicationUtils
import com.tencent.bugly.crashreport.CrashReport
import com.tencent.smtt.export.external.TbsCoreSettings
import com.tencent.smtt.sdk.QbSdk
import com.tencent.smtt.sdk.QbSdk.PreInitCallback
import me.jessyan.autosize.AutoSize
import me.jessyan.autosize.AutoSizeConfig
import me.jessyan.autosize.onAdaptListener
import me.jessyan.autosize.utils.AutoSizeLog
import me.jessyan.autosize.utils.ScreenUtils
import java.util.*

/**
 *
 * @Des:
 * @Author: hwz
 * @Date:2022/4/19 0019
 * @Version: 1.0
 */
class App :Application(), ImageLoaderFactory {

    private lateinit var mContext: Context
    override fun onCreate() {
        super.onCreate()
        mContext = this
        ApplicationUtils.application = this
        initBugly()
        initHttp()

        //头条适配
        initAutoSize()
        initX5()
        (mContext as App).registerActivityLifecycleCallbacks(AppForegroundListener())


    }

    private fun initBugly() {
        val strategy = CrashReport.UserStrategy(mContext)
        strategy.setAppChannel(AppConstant.getLibraryCode())
        strategy.setDeviceID(AppConstant.getMachineUuid())
        changeBuglyUserDate()
        CrashReport.initCrashReport(getApplicationContext(), "abda75fa8d", false);

    }
    fun changeBuglyUserDate() {
        CrashReport.putUserData(mContext, "LibraryCode",AppConstant.getLibraryCode())
        CrashReport.putUserData(mContext, "MachineUuid",AppConstant.getMachineUuid())
        CrashReport.putUserData(mContext, "MachineName",AppConstant.getMachineName())
        CrashReport.putUserData(mContext, "web-url",AppConstant.getWebViewUrl())
    }
    private fun initX5() {
        LogUtils.d("initX5")
        //（可选）为了提高内核占比，在初始化前可配置允许移动网络下载内核（大小 40-50 MB）。默认移动网络不下载
        QbSdk.setDownloadWithoutWifi(true);
        //搜集本地tbs内核信息并上报服务器，服务器返回结果决定使用哪个内核。
        val cb: PreInitCallback = object : PreInitCallback {
            override fun onViewInitFinished(arg0: Boolean) {
                //x5內核初始化完成的回调，为true表示x5内核加载成功，否则表示x5内核加载失败，会自动切换到系统内核。
                LogUtils.e("webview  x5內核初始化:  $arg0")
            }

            override fun onCoreInitFinished() {
                LogUtils.e("webview  onCoreInitFinished")
            }
        }
        //x5内核初始化接口
        QbSdk.initX5Environment(this, cb)
        // 在调用TBS初始化、创建WebView之前进行如下配置
        val map = HashMap<String, Any>()
        map[TbsCoreSettings.TBS_SETTINGS_USE_SPEEDY_CLASSLOADER] = true
        map[TbsCoreSettings.TBS_SETTINGS_USE_DEXLOADER_SERVICE] = true
        QbSdk.initTbsSettings(map)
    }


    private fun initHttp() {
//        setBaseUrl("https://www.wanandroid.com/")

        val retrofitParams = RetrofitParams.Builder()
            .setBaseUrlAdapter(MyBaseUrlAdapter()).build()
        setBaseUrl(retrofitParams.getBaseUrlAdapter()?.getDefaultBaseUrl().toString())
        setHttpClient(OkHelper.httpClient(applicationContext,retrofitParams))
    }

    override fun newImageLoader(): ImageLoader {
        val retrofitParams = RetrofitParams.Builder()
            .setBaseUrlAdapter(MyBaseUrlAdapter()).build()
        return ImageLoader.Builder(applicationContext)
            .crossfade(true)
            .okHttpClient { OkHelper.httpClient(applicationContext,retrofitParams) }
            .componentRegistry {
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
                    add(ImageDecoderDecoder(applicationContext))
                } else {
                    add(GifDecoder())
                }
                add(SvgDecoder(applicationContext))
            }
            .build()
    }

    private fun initAutoSize() {
        var design_width_in_dp = 0
        var design_height_in_dp = 0
        var isVertrical = true
        LogUtils.d("screenWidth:${AutoSizeConfig.getInstance().screenWidth} screenHeight:${AutoSizeConfig.getInstance().screenHeight}")
        if (AutoSizeConfig.getInstance().screenWidth > AutoSizeConfig.getInstance().screenHeight){
            design_width_in_dp = 640
            design_height_in_dp = 360
        }else{
            design_width_in_dp = 360
            design_height_in_dp = 640
//            design_width_in_dp = 540
//            design_height_in_dp = 960
        }


//        design_width_in_dp = 600
//        design_height_in_dp = 960
        //当 App 中出现多进程, 并且您需要适配所有的进程, 就需要在 App 初始化时调用 initCompatMultiProcess()
        AutoSize.initCompatMultiProcess(this);
        //如果在某些特殊情况下出现 InitProvider 未能正常实例化, 导致 AndroidAutoSize 未能完成初始化
        //可以主动调用 AutoSize.checkAndInit(this) 方法, 完成 AndroidAutoSize 的初始化后即可正常使用
        AutoSize.checkAndInit(this);

//        如何控制 AndroidAutoSize 的初始化，让 AndroidAutoSize 在某些设备上不自动启动？https://github.com/JessYanCoding/AndroidAutoSize/issues/249
        /**
         * 以下是 AndroidAutoSize 可以自定义的参数, [AutoSizeConfig] 的每个方法的注释都写的很详细
         * 使用前请一定记得跳进源码，查看方法的注释, 下面的注释只是简单描述!!!
         */
        AutoSizeConfig.getInstance()
            .setDesignHeightInDp(design_height_in_dp)
            .setDesignWidthInDp(design_width_in_dp) //是否让框架支持自定义 Fragment 的适配参数, 由于这个需求是比较少见的, 所以须要使用者手动开启
            //如果没有这个需求建议不开启
            .setCustomFragment(false) //是否屏蔽系统字体大小对 AndroidAutoSize 的影响, 如果为 true, App 内的字体的大小将不会跟随系统设置中字体大小的改变
            //如果为 false, 则会跟随系统设置中字体大小的改变, 默认为 false
            .setExcludeFontScale(false) //区别于系统字体大小的放大比例, AndroidAutoSize 允许 APP 内部可以独立于系统字体大小之外，独自拥有全局调节 APP 字体大小的能力
//            .setVertical(isVertrical)
            .setLog(true)
            //当然, 在 APP 内您必须使用 sp 来作为字体的单位, 否则此功能无效, 不设置或将此值设为 0 则取消此功能
            .setPrivateFontScale(1.0f).onAdaptListener = object : onAdaptListener {
            override fun onAdaptBefore(target: Any, activity: Activity) {
                //使用以下代码, 可以解决横竖屏切换时的屏幕适配问题
                //使用以下代码, 可支持 Android 的分屏或缩放模式, 但前提是在分屏或缩放模式下当用户改变您 App 的窗口大小时
                //系统会重绘当前的页面, 经测试在某些机型, 某些情况下系统不会重绘当前页面, ScreenUtils.getScreenSize(activity) 的参数一定要不要传 Application!!!
                                        AutoSizeConfig.getInstance().setScreenWidth(ScreenUtils.getScreenSize(activity)[0]);
                                        AutoSizeConfig.getInstance().setScreenHeight(ScreenUtils.getScreenSize(activity)[1]);
                AutoSizeLog.d(
                    String.format(
                        Locale.ENGLISH,
                        "%s onAdaptBefore!",
                        target.javaClass.name
                    )
                )
            }

            override fun onAdaptAfter(target: Any, activity: Activity) {
                AutoSizeLog.d(
                    String.format(
                        Locale.ENGLISH,
                        "%s onAdaptAfter!",
                        target.javaClass.name
                    )
                )
            }
        }


        //是否打印 AutoSize 的内部日志, 默认为 true, 如果您不想 AutoSize 打印日志, 则请设置为 false
        //                .setLog(false)
        //是否使用设备的实际尺寸做适配, 默认为 false, 如果设置为 false, 在以屏幕高度为基准进行适配时
        //AutoSize 会将屏幕总高度减去状态栏高度来做适配
        //设置为 true 则使用设备的实际屏幕高度, 不会减去状态栏高度
        //在全面屏或刘海屏幕设备中, 获取到的屏幕高度可能不包含状态栏高度, 所以在全面屏设备中不需要减去状态栏高度，所以可以 setUseDeviceSize(true)
        //                .setUseDeviceSize(true)
        //是否全局按照宽度进行等比例适配, 默认为 true, 如果设置为 false, AutoSize 会全局按照高度进行适配
        //                .setBaseOnWidth(false)
        //设置屏幕适配逻辑策略类, 一般不用设置, 使用框架默认的就好
        //                .setAutoAdaptStrategy(new AutoAdaptStrategy())
    }

}